home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 050 / pibasync.arc / ASYNCREC.ASM < prev    next >
Encoding:
Assembly Source File  |  1986-10-31  |  2.4 KB  |  60 lines

  1. ;
  2. ;  Check if any characters in input comm buffer
  3. ;
  4.          MOV   AX,[>Async_Buffer_Tail]
  5.          CMP   AX,[>Async_Buffer_Head]
  6.          JNE   Rec1
  7. ;
  8. ;  Buffer is empty -- return NUL character
  9. ;
  10.          LES   DI,[BP+<C]                   ;Get character address
  11.          XOR   AX,AX                        ;Clear out unused bits
  12.      ES: MOV   [DI],AL                      ;NUL character
  13.          JMP   Return
  14. ;
  15. ;  Buffer not empty -- pick up next character.
  16. ;
  17. Rec1:    LES   DI,[>Async_Buffer_Ptr]       ;Pick up buffer address
  18.          ADD   DI,AX                        ;Add character offset
  19.      ES: MOV   BL,[DI]                      ;Get character from buffer
  20.          LES   DI,[BP+<C]                   ;Get result address
  21.      ES: MOV   [DI],BL                      ;Store character from buffer
  22.          INC   AX                           ;Increment tail pointer
  23.          CMP   AX,[>Async_Buffer_Size]      ;Past end of buffer?
  24.          JLE   Rec2                         ;No -- skip wrapping
  25.          XOR   AX,AX                        ;Yes -- point to start of buffer
  26. Rec2:    MOV   [>Async_Buffer_Tail],AX      ;Update tail pointer
  27.          DEC   Word [>Async_Buffer_Used]    ;Update buffer use count
  28. ;
  29. ; If XOFF previously sent because buffer was too full, and
  30. ; now buffer is reasonably empty, send XON to get things rolling again.
  31. ;
  32.          TEST  BYTE [<Async_XOff_Sent],1    ;Check if Xoff sent
  33.          JZ    Rec3                         ;No -- skip.
  34. ;
  35.          MOV   AX,[>Async_Buffer_Used]      ;Pick up amount of buffer used
  36.          CMP   AX,[>Async_Buffer_Low]       ;Check if low enough
  37.          JG    Rec3                         ;Still too full, skip
  38. ;
  39.          MOV   AX,>XON                      ;Else push XON onto stack
  40.          PUSH  AX
  41.          LEA   BX,[>Async_Send]             ;Call output routine
  42. ;
  43. ;-----WARNING---- Following statement must be fixed by hand in .OBJ file!
  44. ;---------------- Generated code should read:
  45. ;                 $FF/ $D3/
  46. ;
  47.          CALL  [BX]                         ;THIS MUST BE FIXED BY HAND!!!!!
  48. ;
  49.          MOV   BYTE [>Async_XOff_Sent],0    ;Clear Xoff flag
  50. ;
  51. ;  Indicate character found
  52. ;
  53. Rec3:    MOV    AX,1
  54. ;
  55. Return:  AND    Byte [>Async_Line_Status],$FD ;Remove overflow flag
  56.          OR     AX,AX                       ;Set zero flag to indicate return status
  57.          MOV    SP,BP
  58.          POP    BP
  59.          RET    5
  60.